// 节点类定义
class ListNode {
    val: number;
    next: ListNode | null = null;
    constructor(val: number) {
        this.val = val;
    }
}

// 解法一：哈希集合
function removeDuplicateNodes(head: ListNode): ListNode | null {
    const hashSet = new Set<number>();// 声明哈希集合
    let dummy: ListNode = new ListNode(0);// 声明哨兵节点
    dummy.next = head;
    let prev: ListNode = dummy;// 声明前序节点
    while (head !== null) {
        // 当哈希集合存在当前节点值时
        if (hashSet.has(head.val)) {
            prev.next = head.next;
        } else { // 当哈希集合不存在当前节点值时
            hashSet.add(head.val);// 更新哈希集合
            prev = head;
        }
        // 移动当前节点
        head = head.next;
    }
    return dummy.next;
};

// 解法二：快慢指针循环
function removeDuplicateNodes2(head: ListNode): ListNode | null {
    if (!head) {
        return null;
    }
    let dummy: ListNode = new ListNode(0);// 声明哨兵节点
    dummy.next = head;
    let slow: ListNode = head;// 声明慢指针
    while (slow !== null) {
        let fast: ListNode = slow;// 声明快指针
        while (fast.next !== null) {// 快指针这一轮次走到头
            if (fast.next.val === slow.val) {
                fast.next = fast.next.next;// 跳过相同节点
            } else {
                fast = fast.next;
            }
        }
        slow = slow.next;
    }
    return dummy.next;
};
